package org.zizi.db;

import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.zizi.db.charset.CharsetEncoder;
import org.zizi.db.tool.EasySqlTool;
import org.zizi.db.tool.SqlHelper;

public interface EasySql
{
	/** 开始一个事务，采用指定的并发隔离度，从指定连接池取一个连接 */
	public void begin(int isolation, DataSource source) throws Exception;
	
	/** 提交事务。如果真正提交了一个事务，返回真，否则返回假 */
	public boolean commit() throws SQLException;
	
	/** 结束事务，尚未提交的事务被回滚。如果真正结束了一个事务，返回真，如果事务没有开始，或者是内部嵌套事务的结束，返回假 */
	public boolean end();
	
	/** 设置事务并发隔离度 */
	public void setIsolation(int isolation) throws Exception;
	
	/** 查询工具 */
	public EasySqlTool tool();
	
	/** 帮助工具 */
	public SqlHelper helper();
	
	/** 字符编码转换 */
	public CharsetEncoder charset();
	
	/** 执行返回一行结果的查询，将结果封装成指定类型的对象。 */
	public <T> T query(Class<T> type, String sql, Object... parameters) throws Exception;

	/** 执行返回多行结果的查询，将结果封装成指定类型的对象列表。 */
	public <T> List<T> list(Class<T> type, String sql, Object... parameters) throws Exception;
	
	/** 执行返回多行结果的查询，将结果分页封装成指定类型的对象列表。 */
	public abstract <T> List<T> page(Class<T> type, int offset, int limit, String sql, Object... parameters) throws Exception;

	/** 执行更新查询，返回更新行数。 */
	public int update(String sql, Object... parameters) throws Exception;
	
	///////////
	
	public static enum DatabaseType
	{
		ORACLE,
		POSTGRESQL;
		
		public static DatabaseType get(String name)
		{
			name = name.toUpperCase();
			
			if (ORACLE.name().equals(name))
				return ORACLE;
			else if (POSTGRESQL.name().equals(name))
				return POSTGRESQL;
			
			return null;
		}
	}
}
